/* 
 * File:   HashTable.h
 * Author: igui
 *
 * Created on 28 de mayo de 2011, 08:27 PM
 */
#include "LinkedHashEntry.h"
#include "HashTableIterator.h"

#ifndef _HASHTABLE_H
#define	_HASHTABLE_H

// hay una dependencia circular entre HashTableIterator y HashTable
// la declaración sirve para que compile el .h
class HashTableIterator;

/**
 *  Un hash con encadenamiento y redimensionamiento dinámico que almacena
 *  objetos de tipo ICollection usando claves HashedKey
 *
 *  La implementación está basada en 
 *  http://www.algolist.net/Data_structures/Hash_table/Dynamic_resizing
 */
class HashTable {
private:
    float threshold; 
    unsigned int maxSize;
    unsigned int tableSize;
    unsigned int size;
    LinkedHashEntry **table;
    
    void resize();
    
public:
    HashTable();
    
    /// Obtiene el elemento que coincide con la clave dada o NULL si no existe
    ICollectible *get(HashedKey *key);
    
    /// Setea el elemento del hash con una clave dada, si ya existía lo 
    /// sobreescribe. No borra el elemento sobreescrito
    void put(HashedKey *key, ICollectible *value);
    
    /// Quita un elemento del hash. No lo borra
    void remove(HashedKey *key);
    
    /// Da el tamaño de la tabla: cuantas claves contiene
    int getSize();

    /// obtiene un conjunto con las claves de la tabla. Guarda el resultado
    /// en resArray creando con new y cuyo tamaño es igual a getSize()
    void getKeys(HashedKey **&resArray);
        
    /// retorna una nueva instancia de HashTableIterator creada con new
    HashTableIterator *getIterator();
    
    /// Borra la tabla y las claves pero no los valores
    ~HashTable();
};


#endif	/* _HASHTABLE_H */

